using UnityEngine;
using UnityEditor;

/// <summary>
/// SunSpawnConfig 的自定义编辑器
/// </summary>
[CustomEditor(typeof(SunSpawnConfig))]
public class SunSpawnConfigEditor : Editor
{
    private SerializedProperty m_ParabolaEasingProperty;
    
    private void OnEnable()
    {
        // 更新序列化对象
        serializedObject.Update();
        
        // 获取序列化属性
        m_ParabolaEasingProperty = serializedObject.FindProperty("_parabolaEasing");
        
        // 如果找不到字段，尝试其他可能的名称
        if (m_ParabolaEasingProperty == null)
        {
            Logger.LogWarning($"无法找到 _parabolaEasing 字段。尝试查找其他属性...");
            
            // 列出所有属性名称（用于调试）
            SerializedProperty iterator = serializedObject.GetIterator();
            while (iterator.NextVisible(true))
            {
                if (iterator.name.Contains("parabola") || iterator.name.Contains("Parabola") || iterator.name.Contains("Easing"))
                {
                    Logger.Log($"找到相关属性: {iterator.name} (类型: {iterator.type})");
                }
            }
        }
    }
    
    public override void OnInspectorGUI()
    {
        // 更新序列化对象
        serializedObject.Update();
        
        // 绘制默认Inspector（除了ParabolaEasing）
        DrawPropertiesExcluding(serializedObject, new string[] { "_parabolaEasing" });
        
        // 手动绘制ParabolaEasing曲线编辑器
        EditorGUILayout.Space();
        EditorGUILayout.LabelField("抛物线动画缓动类型（控制飘落速度变化）", EditorStyles.boldLabel);
        
        UnityEngine.AnimationCurve currentCurve = null;
        bool usingProperty = false;
        
        // 尝试通过SerializedProperty获取
        if (m_ParabolaEasingProperty != null)
        {
            currentCurve = m_ParabolaEasingProperty.animationCurveValue;
            usingProperty = true;
        }
        else
        {
            // 备用方案：通过属性访问
            SunSpawnConfig config = target as SunSpawnConfig;
            if (config != null)
            {
                currentCurve = config.ParabolaEasing;
            }
        }
        
        // 如果曲线为空或无效，初始化默认曲线
        bool needsInit = false;
        if (currentCurve == null)
        {
            needsInit = true;
        }
        else
        {
            // 尝试评估曲线以检查是否有效
            try
            {
                float test = currentCurve.Evaluate(0.5f);
            }
            catch
            {
                // 如果评估失败，需要重新初始化
                needsInit = true;
            }
        }
        
        // 如果需要初始化，创建默认曲线
        if (needsInit)
        {
            currentCurve = new UnityEngine.AnimationCurve();
            currentCurve.AddKey(0f, 0f);
            currentCurve.AddKey(1f, 1f);
            
            // 更新到序列化属性或属性
            if (usingProperty && m_ParabolaEasingProperty != null)
            {
                m_ParabolaEasingProperty.animationCurveValue = currentCurve;
            }
            else
            {
                SunSpawnConfig config = target as SunSpawnConfig;
                if (config != null)
                {
                    config.ParabolaEasing = currentCurve;
                }
            }
        }
        
        // 使用EditorGUI.CurveField绘制曲线编辑器
        EditorGUILayout.LabelField("Parabola Easing", EditorStyles.boldLabel);
        UnityEngine.AnimationCurve newCurve = EditorGUILayout.CurveField(currentCurve);
        
        // 更新序列化属性或属性
        if (newCurve != null && newCurve != currentCurve)
        {
            if (usingProperty && m_ParabolaEasingProperty != null)
            {
                m_ParabolaEasingProperty.animationCurveValue = newCurve;
            }
            else
            {
                SunSpawnConfig config = target as SunSpawnConfig;
                if (config != null)
                {
                    config.ParabolaEasing = newCurve;
                    EditorUtility.SetDirty(config);
                }
            }
        }
        
        // 显示曲线信息提示
        EditorGUILayout.HelpBox("调整此曲线可以控制阳光飘落的速度变化。\n" +
                               "• 向上凸起：开始快，后来慢\n" +
                               "• 向下凹陷：开始慢，后来快\n" +
                               "• S形曲线：开始慢，中间快，后来慢", 
                               MessageType.Info);
        
        // 如果使用备用方案，显示提示
        if (!usingProperty)
        {
            EditorGUILayout.HelpBox("注意：使用备用方案访问曲线。如果可能，请确保 _parabolaEasing 字段可以序列化。", MessageType.Warning);
        }
        
        // 应用修改
        serializedObject.ApplyModifiedProperties();
    }
}

